package mx.com.asteca.fachada.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import mx.com.asteca.comun.dto.AlumnoDTO;
import mx.com.asteca.comun.dto.CursoDTO;
import mx.com.asteca.comun.dto.MateriaDTO;
import mx.com.asteca.comun.dto.ProgramaEstudiosDTO;
import mx.com.asteca.fachada.EmisionCertificadoFachada;
import mx.com.asteca.fachada.FachadaException;
import mx.com.asteca.servicio.AlumnoServicio;
import mx.com.asteca.servicio.CursoServicio;
import mx.com.asteca.servicio.MateriaServicio;
import mx.com.asteca.servicio.ProgramaEstudiosServicio;
import mx.com.asteca.servicio.ServicioException;

import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class EmisionCertificadoFachadaImpl implements EmisionCertificadoFachada{
	
	@Autowired
	private CursoServicio servicioCurso;
	@Autowired
	private AlumnoServicio servicioAlumno;
	@Autowired
	private ProgramaEstudiosServicio servicioProgrEstudios;
	@Autowired
	private MateriaServicio servicioMateria;
	
	@Override
	public CursoDTO findByPK(Integer pk) throws FachadaException{
		try{
			CursoDTO dto = servicioCurso.findByPK(pk);
			return dto;
		}catch (ServicioException e) {
			throw new FachadaException("Error en findByPK:"+e.getMessage(), e);
		}
	}
	
	@Override
	public List<CursoDTO> findAllCursos() throws FachadaException{
		try {
			List<CursoDTO> lista = servicioCurso.getAll();
			return lista;
		} catch (ServicioException e) {
			throw new FachadaException("Error en findAllCursos:"+e.getMessage(), e);
		}
	}
	
	@Override
	public List<AlumnoDTO> findAlumnosPorCurso(CursoDTO cursoReferencia) throws FachadaException{
		try{
			List<AlumnoDTO> listaAlumnos = servicioAlumno.findAlumnosByCurso(cursoReferencia.getIdCurso());
			return listaAlumnos;
		} catch (ServicioException e) {
			throw new FachadaException("Error en findAlumnosPorCurso:"+e.getMessage(), e);
		}
	}
	
	@Override
	public ProgramaEstudiosDTO findProgramaEstudiosPorCurso(CursoDTO cursoReferencia) throws FachadaException{
		try{
			ProgramaEstudiosDTO dto =  servicioProgrEstudios.findByPK(cursoReferencia.getIdProgrEstudios());
			return dto;
		} catch (ServicioException e) {
			throw new FachadaException("Error en findProgramaEstudiosPorCurso:"+e.getMessage(), e);
		}
	}
	
	@Override
	public Map<MateriaDTO, String> findMateriasCalificaciones(CursoDTO referencia, AlumnoDTO alumnoRef) throws FachadaException{
		try{
			List<MateriaDTO> listaMaterias =  servicioMateria.findMateriasPorCurso(referencia.getIdCurso());
			if(CollectionUtils.isEmpty(listaMaterias)){
				return null;
			}
			Map<MateriaDTO, String> mapMateriasCalif = new HashMap<MateriaDTO, String>();
			for(MateriaDTO materia : listaMaterias){
				String calificacion = servicioAlumno.getCalificacion(alumnoRef.getIdAlumno(), referencia.getIdCurso(), materia.getIdMateria());
				mapMateriasCalif.put(materia, calificacion);
			}
			return mapMateriasCalif;
		}catch (ServicioException e) {
			throw new FachadaException("Error en findMateriasCalificaciones:"+e.getMessage(), e);
		}
	}

}
